/**
 * 其他玩家人物类
 * @class
 */
class Net_Character extends Game_Character {

    /**
     * 初始化
     * @param {object} data 玩家数据
     */
    initialize(data) {
        super.initialize();
        this._data = data;
        this._sprite = null;
        this._mapState = "map";
        this.setImage();
        this.setMoveSpeed(5);
    }

    /**
     * 设置人物行走图
     */
    setImage() {
        const { characterName, characterIndex } = this._data;
        super.setImage(characterName, characterIndex);
    }

    /**
     * 设置位置
     */
    setLocation() {
        //netx、y存在，这说明当前设置位置时是玩家打开菜单或其他场景返回地图的情况，此时不能使用进入地图时获取的数据x、y
        const x = this._netX ?? this._data.x;
        const y = this._netY ?? this._data.y;
        this.locate(x, y);
    }

    /**
     * 创建人物精灵
     */
    createSprite() {
        this._sprite = new Sprite_Character(this);
    }

    /**
     * 获取人物精灵
     * @returns {Sprite_Character} 人物精灵
     */
    sprite() {
        return this._sprite;
    }

    /**
     * 添加net人物到游戏中
     */
    add() {
        const { uid } = this._data;
        this.setLocation();
        NetManager.players.set(uid, this);
        if (SceneManager._scene.constructor.name === "Scene_Map") {
            const spriteset = SceneManager._scene._spriteset._tilemap;
            this.createSprite();
            spriteset.addChild(this.sprite());
        }
    }

    /**
     * 玩家离开地图后移除该人物
     */
    remove() {
        const { uid } = this._data;
        const sprite = this.sprite();
        sprite.parent.removeChild(sprite);
        sprite.destroy();
        NetManager.players.delete(uid);
    }

    /**
     * 设置人物的最新位置
     * @param {number} x 该玩家最新的位置x坐标
     * @param {number} y 该玩家最新的位置x坐标
     */
    setNetPosition(x, y) {
        this._netX = x;
        this._netY = y;
    }

    /**
     * 更新
     */
    update() {
        super.update();
        if (this.isMoving() || !this._netX || !this._netY) return;
        if (this._netX !== this._realX || this._netY !== this._realY) {
            //寻路算法好像没必要，后面换一个效率高的
            // const direction = this.findDirectionTo(this._netX, this._netY);
            //简单移动，测试ing
            const direction = this.move(this._netX, this._netY);
            if (direction > 0) {
                this.moveStraight(direction);
            }
        }
        // super.update();
    }

    /**
     * 获取玩家人物的名字
     * @returns {string} 名字
     */
    name() {
        return this._data.name;
    }

    /**
     * 设置玩家人物在地图上的状态
     * @param {string} state 状态
     */
    setMapState(state) {
        this._mapState = state;
        this._nameSprite.refresh();
    }

    /**
     * 得到玩家人物在地图上的状态
     * @returns {string} 状态
     */
    getMapState() {
        return this._mapState;
    }

    /**
     * 得到玩家人物的数据
     * @returns {object} 数据
     */
    getData() {
        return this._data;
    }

    /**
     * 向目标点移动
     * @param {number} x 目标点x坐标
     * @param {number} y 目标点y坐标
     * @returns {number} 方向
     */
    move(x, y) {
        const sx = this.deltaXFrom(x);
        const sy = this.deltaYFrom(y);
        if (sx !== 0 && sy !== 0) {
            return sx > 0 ? 4 : 6, sy > 0 ? 8 : 2;
        } else if (sx !== 0) {
            return sx > 0 ? 4 : 6;
        } else if (sy !== 0) {
            return sy > 0 ? 8 : 2;
        }
    }
}